1 /*
2 * PreferencesTreeModel
3 *
4 * $RCSfile: PreferencesTreeModel.java,v $
5 * $Revision: 1.3 $
6 * $Date: 2004/01/10 20:10:46 $
7 * $Source: /cvsroot/jpui/jpui/src/PreferencesTreeModel.java,v $
8 *
9 * JPUI - Java Preferences User Interface
10 * Copyright (C) 2003
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 *
17 * This program is distributed in the hope that it will be useful, but WITHOUT
18 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
20 * more details.
21 *
22 * You should have received a copy of the GNU General Public License along with
23 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
24 * Place, Suite 330, Boston, MA 02111-1307 USA
25 *
26 * Author: macksold@users.sourceforge.net
27 */
28
29 import java.util.Collections;
30 import java.util.Stack;
31 import java.util.Vector;
32 import java.util.prefs.BackingStoreException;
33 import java.util.prefs.Preferences;
34
35 import javax.swing.event.TreeModelEvent;
36 import javax.swing.event.TreeModelListener;
37 import javax.swing.tree.TreeModel;
38 import javax.swing.tree.TreePath;
39
40 /***
41 * Class that exposes java preferences as a TreeModel.
42 * RootPreferencesNode is a root node to the TreeModel which
43 * turns the User preference root and System preference root
44 * into its child nodes. The root nodes two children and all of their descendants
45 * are of type PreferencesNode.
46 */
47 public class PreferencesTreeModel implements TreeModel {
48 // vector of listeners to send tree change events to
49 private Vector moListeners = new Vector();
50 // root of the preference tree
51 private RootPreferencesNode moRoot = new RootPreferencesNode();
52
53 /***
54 * @see javax.swing.tree.TreeModel#getRoot()
55 */
56 public Object getRoot() {
57 return moRoot;
58 }
59
60 /***
61 * @see javax.swing.tree.TreeModel#getChild(java.lang.Object, int)
62 */
63 public Object getChild(Object oParent, int nIndex) {
64 Preferences oPref = (Preferences) oParent;
65 Preferences oChild = null;
66 try {
67 String[] sChildren = oPref.childrenNames();
68 oChild = oPref.node(sChildren[nIndex]);
69 }
70 catch (BackingStoreException oEx) {
71 oEx.printStackTrace();
72 }
73
74 return oChild;
75 }
76
77 /***
78 * @see javax.swing.tree.TreeModel#getChildCount(java.lang.Object)
79 */
80 public int getChildCount(Object oParent) {
81 Preferences oPref = (Preferences) oParent;
82 int nCount = 0;
83 try {
84 nCount = oPref.childrenNames().length;
85 }
86 catch (BackingStoreException oEx) {
87 oEx.printStackTrace();
88 }
89
90 return nCount;
91 }
92
93 /***
94 * @see javax.swing.tree.TreeModel#isLeaf(java.lang.Object)
95 */
96 public boolean isLeaf(Object oNode) {
97 return false;
98 }
99
100 /***
101 * @see javax.swing.tree.TreeModel#valueForPathChanged(javax.swing.tree.TreePath, java.lang.Object)
102 */
103 public void valueForPathChanged(TreePath oPath, Object oNewValue) {
104 Preferences oOldValue = (Preferences) oPath.getLastPathComponent();
105
106 for (int i = 0; i < moListeners.size(); i++) {
107 TreeModelEvent oEvent =
108 new TreeModelEvent(this, new Object[] { moRoot });
109
110 ((TreeModelListener) moListeners.elementAt(i)).treeNodesChanged(
111 oEvent);
112 }
113 }
114
115 /***
116 * @see javax.swing.tree.TreeModel#getIndexOfChild(java.lang.Object, java.lang.Object)
117 */
118 public int getIndexOfChild(Object oParent, Object oChild) {
119 if (oParent == null || oChild == null) {
120 return -1;
121 }
122 int nIndex = -1;
123 Preferences oPref = (Preferences) oParent;
124 Preferences oPrefChild = (Preferences) oChild;
125 try {
126 String[] sChildren = oPref.childrenNames();
127 for (int i = 0; i < sChildren.length; i++) {
128 if (sChildren[i].equals(oPrefChild.name())) {
129 nIndex = i;
130 break;
131 }
132 }
133 }
134 catch (BackingStoreException oEx) {
135 oEx.printStackTrace();
136 }
137
138 return nIndex;
139 }
140
141 /***
142 * @see javax.swing.tree.TreeModel#addTreeModelListener(javax.swing.event.TreeModelListener)
143 */
144 public void addTreeModelListener(TreeModelListener oListener) {
145 moListeners.add(oListener);
146 }
147
148 /***
149 * @see javax.swing.tree.TreeModel#removeTreeModelListener(javax.swing.event.TreeModelListener)
150 */
151 public void removeTreeModelListener(TreeModelListener oListener) {
152 moListeners.remove(oListener);
153 }
154
155 /***
156 * @param sNewNode
157 */
158 public void newNode(String sNewNode) {
159 // create the node
160 Preferences oNewNode =
161 PreferencesModel.Instance().newNode(sNewNode);
162
163 // send notifications
164 for (int i = 0; i < moListeners.size(); i++) {
165 TreeModelEvent oEvent =
166 new TreeModelEvent(this, toTreePath(oNewNode.parent()));
167 ((TreeModelListener) moListeners.elementAt(i)).treeStructureChanged(
168 oEvent);
169 }
170 }
171
172 /***
173 *
174 */
175 public void deleteNode() {
176 // delete the node
177 Preferences oParent = PreferencesModel.Instance().deleteNode();
178
179 // send notifications
180 for (int i = 0; i < moListeners.size(); i++) {
181 TreeModelEvent oEvent =
182 new TreeModelEvent(this, toTreePath(oParent));
183 ((TreeModelListener) moListeners.elementAt(i)).treeStructureChanged(
184 oEvent);
185 }
186 }
187
188 /***
189 * @param oPref
190 * @return javax.swing.tree.TreePath
191 */
192 public TreePath toTreePath(Preferences oPref) {
193 Stack oStack = new Stack();
194
195 while(oPref != null) {
196 oStack.push(oPref);
197 oPref = oPref.parent();
198 }
199 // oStack now contains all the nodes up the the root, except the root
200 oStack.push(moRoot);
201
202 // reverse the order of the stack elements
203 Collections.reverse(oStack);
204
205 return new TreePath(oStack.toArray(new Preferences[0]));
206 }
207 }
This page was automatically generated by Maven